package ar.com.quickMart.database.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import ar.com.quickMart.database.ChatDao;
import ar.com.quickMart.logic.ChatMessage;

public class ChatDaoMySql extends BaseDaoMySql implements ChatDao{
	
	public boolean addChatMessage(long employeeId, Date date, String text){
		// Creo variable para la conexion
		Connection connection;
				
		// Abro la conexion
		connection = connect();
				
		// Creo el query de insercion
		String query = "INSERT INTO MensajeChat (EmpleadoSucursal_id, Fecha, Mensaje) VALUES (?, ?, ?);";

		try {
					
			// Creo la sentencia y ejecuto el query
			PreparedStatement statement = connection.prepareStatement(query);
			statement.setLong(1, employeeId);
			statement.setTimestamp(2, new java.sql.Timestamp(date.getTime()));
			statement.setString(3, text);
			
			statement.executeUpdate();
		}
		catch (Exception ex) {
			ex.printStackTrace();
					
			// Desconecto de la BDD
			disconnect(connection);
					
			// Error al agregar usuario, devuelvo false
			return false;
		}
				
		// Desconecto de la BDD
		disconnect(connection);
				
		// Usuario agregado exitosamente, devuelvo true
		return true;
	}
	
	public boolean removeChatMessage(long id){
		
		// Creo variable para la conexion
		Connection connection;
				
		// Abro la conexion
		connection = connect();
				
		// Creo el query
		String query = "DELETE FROM MensajeChat WHERE id = ?;";

		try {
				
			// Creo la sentencia y ejecuto el query
			PreparedStatement statement = connection.prepareStatement(query);
			statement.setLong(1, id);
			statement.executeUpdate();
		}
		catch (Exception ex) {
			ex.printStackTrace();
					
			// Desconecto de la BDD
			disconnect(connection);
					
			// Error al eliminar usuario, devuelvo false
			return false;
		}
				
		// Desconecto de la BDD
		disconnect(connection);
				
		// Usuario eliminado, devuelvo true
		return true;
	}
	
	public List<ChatMessage> getChatMessages(long employeeId, int count){
		// Creo variable para la conexion
		Connection connection;
						
		// Creo variables para el resultado de la consulta
		ResultSet result;
				
		List<ChatMessage> messages= new ArrayList<ChatMessage>();
						
		// Abro la conexion
		connection = connect();
						
		// Creo el query
		String query = "SELECT M.id, M.Fecha, M.Mensaje, E.Nombre_User From MensajeChat M JOIN EmpleadoSucursal E ON M.EmpleadoSucursal_id = E.id  WHERE EmpleadoSucursal_id = ? ORDER BY id LIMIT ?;";

		try {
							
			// Creo la sentencia y ejecuto el query
			PreparedStatement statement = connection.prepareStatement(query);
			statement.setLong(1, employeeId);
			statement.setInt(2, count);
					
			result = statement.executeQuery();
							
			// Obtengo datos de la consulta
			result = statement.getResultSet();
							
			while(result.next()) {
				
				ChatMessage m = new ChatMessage();
				
				m.setId(result.getLong("id"));
				java.sql.Timestamp auxDate = result.getTimestamp("Fecha");
				m.setDateTime(new Date(auxDate.getTime()));
				m.setText(result.getString("Mensaje"));
				m.setSenderUserName(result.getString("Nombre_User"));
				
				messages.add(m);
			}
					
		}
		catch (Exception ex) {
			ex.printStackTrace();
							
			// Desconecto de la BDD
			disconnect(connection);
							
			// Error al obtener clave, devuelvo null
			return null;
		}
						
		// Desconecto de la BDD
		disconnect(connection);
						
		if(messages.size() > 0){
			return messages;
		}
		else{
			return null;
		}
	}

	@Override
	public List<ChatMessage> getChatMessagesFromBranch(long branchId, int count) {
		// Creo variable para la conexion
				Connection connection;
								
				// Creo variables para el resultado de la consulta
				ResultSet result;
						
				List<ChatMessage> messages= new ArrayList<ChatMessage>();
								
				// Abro la conexion
				connection = connect();
								
				// Creo el query
				String query = "SELECT M.id, M.Fecha, M.Mensaje, E.Nombre_User From MensajeChat M JOIN EmpleadoSucursal E ON M.EmpleadoSucursal_id = E.id  WHERE Sucursal_id = ? ORDER BY id LIMIT ?;";

				try {
									
					// Creo la sentencia y ejecuto el query
					PreparedStatement statement = connection.prepareStatement(query);
					statement.setLong(1, branchId);
					statement.setInt(2, count);
							
					result = statement.executeQuery();
									
					// Obtengo datos de la consulta
					result = statement.getResultSet();
									
					while(result.next()) {
						
						ChatMessage m = new ChatMessage();
						
						m.setId(result.getLong("id"));
						
						java.sql.Timestamp auxDate = result.getTimestamp("Fecha");
						m.setDateTime(new Date(auxDate.getTime()));
						m.setText(result.getString("Mensaje"));
						m.setSenderUserName(result.getString("Nombre_User"));
						
						messages.add(m);
					}
							
				}
				catch (Exception ex) {
					ex.printStackTrace();
									
					// Desconecto de la BDD
					disconnect(connection);
									
					// Error al obtener clave, devuelvo null
					return null;
				}
								
				// Desconecto de la BDD
				disconnect(connection);
								
				if(messages.size() > 0){
					return messages;
				}
				else{
					return null;
				}
	}

}
